如果无法自动发现本地的JRockit JVM,可以从以下几方面入手检查:
若目标JVM使用的是JDK 1.4版本,则需要在JRockit Mission Control的JVM浏览器视图中手动新建一个连接,然后在目标JRockit JVM上显式开启管理代理。这是因为在JDK 1.4版本中还没有出现MBean服务器的概念,而JRockit 1.4版本中实现了一个私有的管理协议,称为RMP,在客户端会被转换为JMX。要想启动代理,可以通过添加命令行参数,或使用JRCMD工具实现(参见第11章的介绍)。
如果无法连接到外部的管理代理(例如运行在远程机器上的管理代理),可以从以下几方面入手检查:
jmxremote.access
文件是否配置正确?hosts
文件是否配置正确在处理远程管理代理的连接问题时,首先确保开启了SSL,并关闭了身份校验,如果这时可以正常连接,则按照6.2.7节中介绍的内容检查一下校验信息是否配置正确。
如果管理控制台提示说找不到某个MBean,例如Profiling MBean,很可能是由于jmxremote.access
文件配置错误导致的。为了初始化JMXMAPI,用户必须具有创建JRockitConsole
这个MBean的权限,从而正确初始化JMXMAPI,参见6.2.7节的介绍。
有时候,无法连接到远程JVM可能是因为解析主机名时发生了错误,这时系统给出的错误信息可能是下面这个样子:
Could not open Management Console for sthx6454:7094.
java.rmi.ConnectException: Connection refused to host:
127.0.0.1; nested exception is: java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2239)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:271)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:229)
at com.jrockit.console.rjmx.RJMXConnection.setupServer(RJMXConnection.java:504)
RMI Registry通过暴露出依赖于主机名的存根(stub)来建立于RMI服务器的连接。在之前的示例中,成功的连接到RMI Regstry,接收到连接RMI服务器的存根。创建存根的默认行为是使用InetAddress.getLocalHost().getHostAddress()
方法找出所使用的主机名,当主机使用了多个网卡接口或配置错误时,就无法正确解析出主机名了。在之前的示例中,存根中信息指明要连接到localhost
,而不是sthx6454
。
最常见的连接问题是hosts
文件(在Linux系统上,是/etc/hosts
,在Windows系统上,是%SYSTEMROOT%\system32\drivers\etc\hosts)配置错误,在Linux系统上,可以通过hostname -i
命令查看主机名的解析地址。
出了配置hosts
文件外,还可以在服务器端设置java.rmi.server.hostname
系统属性来指定客户端要练级的主机名。注意,设置改属性会影响到同一台机器上正在运行的其他JVM。
另一个解决办法是使用SSH隧道,该方法只在JRockit R28版本中有效,因为在版本中可以显式指定RMI服务器的端口。